﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Runtime.InteropServices;

//using VBE = Microsoft.Vbe.Interop;
//using office = Microsoft.Office.Core;
using System.Data;
using System.Diagnostics;
using 正则 = System.Text.RegularExpressions.Regex;
using VBE = NetOffice.VBIDEApi;
using office = NetOffice.OfficeApi;
using 代码模块 = NetOffice.VBIDEApi.CodeModule;
using 代码窗格 = NetOffice.VBIDEApi.CodePane;
using 插件对象 = NetOffice.VBIDEApi.AddIn;
using 模块类型 = NetOffice.VBIDEApi.Enums.vbext_ComponentType;
using 菜单栏 = NetOffice.OfficeApi.CommandBar;
using 菜单栏按钮 = NetOffice.OfficeApi.CommandBarButton;
using 菜单栏控件 = NetOffice.OfficeApi.CommandBarControl;
using 菜单栏菜单 = NetOffice.OfficeApi.CommandBarPopup;
using 过程类型 = NetOffice.VBIDEApi.Enums.vbext_ProcKind;

//using 代码模块 = Microsoft.Vbe.Interop.CodeModule;
//using 代码窗格 = Microsoft.Vbe.Interop.CodePane;
//using 插件对象 = Microsoft.Vbe.Interop.AddIn;
//using 模块类型 = Microsoft.Vbe.Interop.vbext_ComponentType;
//using 菜单栏 = Microsoft.Office.Core.CommandBar;
//using 菜单栏按钮 = Microsoft.Office.Core.CommandBarButton;
//using 菜单栏控件 = Microsoft.Office.Core.CommandBarControl;
//using 菜单栏菜单 = Microsoft.Office.Core.CommandBarPopup;
//using 过程类型 = Microsoft.Vbe.Interop.vbext_ProcKind;
using static 枸杞VBE插件.VBE助手;
using 枸杞VBE插件.代码格式化;

namespace 枸杞VBE插件
{
    internal static class 命令
    {
        [Debug]
        internal static void 按钮事件(菜单栏按钮 按钮, ref bool _1)
        {
            var 代码 = 代码库.代码库助手.按关键字查询代码库(按钮.Parameter);//.CodeDb.Query().Where(x => x.关键字 == 按钮.Parameter).First();
            代码窗格 活动代码窗格 = VBE助手实例.VBE对象.ActiveCodePane;
            活动代码窗格.GetSelection(out int 当前行号, out _, out _, out _);
            switch (代码.代码类型)
            {
                case "语句":
                    活动代码窗格.CodeModule.InsertLines(当前行号, 代码.代码文本);
                    break;

                case "函数":
                    活动代码窗格.CodeModule.InsertLines(活动代码窗格.CodeModule.CountOfLines + 1, 代码.代码文本);
                    break;

                case "模块":
                    VBE.VBComponent 新模块 = VBE助手实例.VBE对象.ActiveVBProject.VBComponents.Add(模块类型.vbext_ct_StdModule);
                    新模块.Name = 本级(代码.关键字);
                    新模块.CodeModule.AddFromString(代码.代码文本);
                    break;

                case "类模块":
                    VBE.VBComponent 新类模块 = VBE助手实例.VBE对象.ActiveVBProject.VBComponents.Add(模块类型.vbext_ct_ClassModule);
                    新类模块.Name = 本级(代码.关键字);
                    新类模块.CodeModule.AddFromString(代码.代码文本);
                    break;

                default:
                    活动代码窗格.CodeModule.InsertLines(当前行号, 代码.代码文本);
                    break;
            }
        }

        [Info]
        internal static void 无视工程密码(菜单栏按钮 _1, ref bool _2)
        {
            VBE助手实例.破解工程密码.Value.无视工程密码开启();
        }

        [Info]
        internal static void 恢复密码(菜单栏按钮 _1, ref bool _2)
        {
            VBE助手实例.破解工程密码.Value.无视工程密码关闭();
        }

        [Info]
        internal static void 打开logs文件夹(菜单栏按钮 _1, ref bool _2)
        {
            Process.Start(Log.logs文件夹路径);
        }

        [Info]
        internal static void 格式化当前过程(菜单栏按钮 _1, ref bool _2)
        {
            VBE助手实例.Indenter.Value.IndentCurrentProcedure();
        }

        [Info]
        internal static void 格式化当前模块(菜单栏按钮 _1, ref bool _2)
        {
            VBE助手实例.Indenter.Value.IndentCurrentModule();
            VBE助手实例.VBE对象.ActiveCodePane.删除空行();
        }

        [Info]
        internal static void 格式化当前工程(菜单栏按钮 _1, ref bool _2)
        {
            VBE助手实例.Indenter.Value.IndentCurrentProject();
        }

        [Info]
        internal static void 删除空行(菜单栏按钮 _1, ref bool _2)
        {
            VBE助手实例.VBE对象.ActiveCodePane.删除空行();
        }

        [Info]
        internal static void 显示代码库窗体(菜单栏按钮 _, ref bool _1)
        {
            VBE助手实例.代码库窗体.Value.Show();
            VBE助手实例.代码库窗体.Value.Activate();
            VBE助手实例.代码库窗体.Value.生成TV树();
        }

        internal static string 上级(string 关键字)
        {
            return 关键字.Substring(0, 关键字.LastIndexOf(@"\"));
        }

        internal static string 本级(string 关键字)
        {
            return 关键字.Substring(关键字.LastIndexOf(@"\") + 1);
        }
    }
}